package repaso;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

public class Libro {
	private String titulo;
	private String autor;
	private double precio;
	private Set<Tematica> tematicas;

	/**
	 * Pre:
	 * 
	 * @param titulo
	 *            Titulo de la obra.
	 * @param autor
	 *            Autor de la obra.
	 * @param precio
	 *            Precio de la obra. Post: Crea un libro.
	 */
	public Libro(String titulo, String autor, double precio) {
		this.titulo = titulo;
		this.autor = autor;
		this.precio = precio;
		this.tematicas = new HashSet<Tematica>();
	}

	/**
	 * @return Titulo de la obra
	 */
	public String getTitulo() {
		return this.titulo;
	}

	/**
	 * @return Autor de la obra
	 */
	public String getAutor() {
		return this.autor;
	}

	/**
	 * @return Precio de la obra
	 */
	public double getPrecio() {
		return this.precio;
	}

	/**
	 * @return Tematicas pertenecientes a la obra
	 */
	public Set<Tematica> getTematicas() {
		return this.tematicas;
	}

	/**
	 * post: devuelve un conjunto ordenado por precio con elementos de libros
	 * cuyo precio esta entre precioMinimo y precioMaximo
	 */
	public SortedSet<Libro> buscarPorPrecio(List<Libro> libros,
			float precioMinimo, float precioMaximo) {
		SortedSet<Libro> librosOrdenados = new TreeSet<Libro>(
				new PrecioComparador());
		Iterator<Libro> itLibros = libros.iterator();
		while(itLibros.hasNext()){
			Libro nextLibro = itLibros.next();
			if(nextLibro.getPrecio() > precioMinimo && nextLibro.getPrecio() < precioMaximo){
				librosOrdenados.add(nextLibro);
			}
		}
		return librosOrdenados;
	}
	
	/**
	 * post: busca en libros aquellos tienen ALGUNA (al menos una) de las Tematicas indicadas.
	 */
	public List<Libro> buscarPorTematicas(List<Libro> libros, Set<Tematica> tematicas){
		List<Libro> librosPorTematicas = new LinkedList<Libro>();
		Iterator<Libro> itLibros = libros.iterator();
		while(itLibros.hasNext()){
			Libro nextLibro = itLibros.next();
			if(nextLibro.getTematicas().retainAll(tematicas)){
				libros.add(nextLibro);
			}
//			Iterator<Tematica> itTematica = this.getTematicas().iterator();
//			while(itTematica.hasNext()){
//				Tematica nextTematica = itTematica.next();
//				if(nextLibro.getTematicas().contains(nextTematica)){
//					librosPorTematicas.add(nextLibro);
//				}
//			} /*segunda manera*/
		}
		return librosPorTematicas;
	}
}
